package database

import (
	"fmt"
	"log"
	"os"
	"time"

	"markedit/internal/model"

	"github.com/spf13/viper"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var DB *gorm.DB

// InitDatabase 初始化数据库连接
func InitDatabase() error {
	var err error
	
	// 获取数据库配置
	dbPath := viper.GetString("database.path")
	if dbPath == "" {
		// 使用内存数据库进行测试，避免CGO依赖
		dbPath = ":memory:"
	}

	// 如果不是内存数据库，确保数据目录存在
	if dbPath != ":memory:" {
		if err := os.MkdirAll("./data", 0755); err != nil {
			return fmt.Errorf("创建数据目录失败: %v", err)
		}
	}

	// 配置GORM日志
	logLevel := logger.Silent
	if viper.GetString("server.mode") == "debug" {
		logLevel = logger.Info
	}

	// 连接数据库 - 使用纯Go的SQLite驱动
	DB, err = gorm.Open(sqlite.Open(dbPath+"?_pragma=foreign_keys(1)"), &gorm.Config{
		Logger: logger.Default.LogMode(logLevel),
		NowFunc: func() time.Time {
			return time.Now().Local()
		},
	})

	if err != nil {
		return fmt.Errorf("连接数据库失败: %v", err)
	}

	// 配置连接池
	sqlDB, err := DB.DB()
	if err != nil {
		return fmt.Errorf("获取数据库实例失败: %v", err)
	}

	// 设置连接池参数
	sqlDB.SetMaxIdleConns(10)
	sqlDB.SetMaxOpenConns(100)
	sqlDB.SetConnMaxLifetime(time.Hour)

	// 自动迁移数据库表
	if err := AutoMigrate(); err != nil {
		return fmt.Errorf("数据库迁移失败: %v", err)
	}

	log.Println("数据库初始化成功")
	return nil
}

// AutoMigrate 自动迁移数据库表
func AutoMigrate() error {
	return DB.AutoMigrate(
		&model.User{},
		&model.Session{},
		&model.UserFile{},
	)
}

// GetDB 获取数据库实例
func GetDB() *gorm.DB {
	return DB
}

// CloseDatabase 关闭数据库连接
func CloseDatabase() error {
	if DB != nil {
		sqlDB, err := DB.DB()
		if err != nil {
			return err
		}
		return sqlDB.Close()
	}
	return nil
}

// CreateDefaultAdmin 创建默认管理员账户
func CreateDefaultAdmin() error {
	var count int64
	if err := DB.Model(&model.User{}).Count(&count).Error; err != nil {
		return err
	}

	// 如果没有用户，创建默认管理员
	if count == 0 {
		adminUser := &model.User{
			ID:        "admin_001",
			Username:  "admin",
			Email:     "admin@markedit.com",
			Password:  "$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi", // password
			IsActive:  true,
			CreatedAt: time.Now(),
			UpdatedAt: time.Now(),
		}

		if err := DB.Create(adminUser).Error; err != nil {
			return fmt.Errorf("创建默认管理员失败: %v", err)
		}

		log.Println("默认管理员账户创建成功 (用户名: admin, 密码: password)")
	}

	return nil
}